import {createRouter, createWebHashHistory, RouteRecordRaw} from 'vue-router'
import nProgress from 'nprogress'
import {getToken} from "@/utils/auth.ts";
import {initMenuArray} from "@/router/model/menuList.ts";

/* 加载 model 文件夹下所有 .ts 结尾的文件，但不包括 menuList.ts。options的eager参数表示是否在模块加载时就执行加载模块。*/
const modelModules = import.meta.glob('./model/!(menuList).ts',{ eager: true });
// const menuModules = import.meta.glob('./model/menuList.ts',{ eager: true });

const modelRouters : RouteRecordRaw[] = mapModuleRouterList(modelModules)
// const menuRouters : RouteRecordRaw[] = mapModuleRouterList(menuModules)

// 当找不到页面时
const staticRoutes = [
    {
        path: '/:catchAll(.*)',
        redirect: '/404'
    },
    {
        path: '/login',
        name: '登录',
        component: () => import('@/view/login/Login.vue')
    },
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/index',
        name: 'index',
        component: () => import('@/view/Index.vue'),
        children: [
            {
                path: '/home',
                name: '首页',
                component: () => import('@/view/home/Home.vue')
            },
            {
                path: '/404',
                name: '404',
                component: () => import('@/view/error/404.vue')
            },
            // ...menuRouters,
            ...modelRouters
        ]
    },
]

// 固定路由模块转换为路由
export function mapModuleRouterList(modules: Record<string, unknown>): Array<RouteRecordRaw> {
  const routerList: Array<RouteRecordRaw> = [];
  Object.keys(modules).forEach((key) => {
    // @ts-ignore
    const mod = modules[key].default || {};
    const modList = Array.isArray(mod) ? [...mod] : [mod];
    routerList.push(...modList);
  });
  return routerList;
}

/**
 * 创建路由
 */
const router = createRouter({
  // 路由模式 hash模式带#
  history: createWebHashHistory(),
  // history: createWebHistory(),不带#
  routes: staticRoutes
})

let isInit = false

// @ts-ignore
router.beforeEach((to, from, next) => {
    nProgress.start()

    // 登录页直接放行
    if (to.path === '/login') return next()

    // 无token跳登录页
    if (!getToken()) return next('/login')

    // 动态路由未初始化时处理
    if (!isInit) {
        // 阻塞导航直到路由加载完成
        const interval = setInterval(() => {
            if (isInit) {
                clearInterval(interval)
                next({ ...to, replace: true })
            }
        }, 100)
        return
    }

    next()
})


router.afterEach(() => {
  nProgress.done()// 在即将进入新的页面组件前，关闭掉进度条
})

/**
 * 重置路由。
 * 该函数遍历当前路由器中的所有路由，对于具有名称的路由，如果路由器中仍然存在该路由，则移除它。
 * 注意：该函数不接受参数，也不返回任何值。
 */
export function resetRouter() {
    router.clearRoutes()
    staticRoutes.forEach(route => {
        router.addRoute(route)
    })
}

// 添加动态路由的方法
export async function addDynamicRoutes(): Promise<void> {
    return new Promise((resolve, reject) => {
        try {
            // 1. 获取原始路由容器
            const indexRoute = router.getRoutes().find(r => r.name === 'index')
            if (!indexRoute) throw new Error('未找到index路由容器')

            // 2. 获取菜单数据
            initMenuArray().then(menuList => {
                // 3. 创建新路由配置
                const newRoute: RouteRecordRaw = {
                    ...indexRoute,
                    children: [
                        ...(indexRoute.children || []),
                        ...menuList
                    ]
                }

                // 4. 重置路由并添加新配置
                resetRouter()
                router.addRoute(newRoute)
                isInit = true
                resolve()
            }).catch(err => {
                reject(err)
            })
        } catch (error) {
            reject(error)
        }
    })
}


// 修改init函数为异步
async function init(){
    if(getToken()){
        // 1. 等待动态路由加载完成
        await addDynamicRoutes().catch(err => {
            console.error('动态路由加载失败:', err)
            // 可添加降级处理逻辑
            router.push('/404')
        })
    }
}

// 修改路由导出逻辑
export default router

// 在main.ts中等待路由初始化完成
await init()
